#ifndef __GZP_H
#define __GZP_H

#include "gzll.h"
#include "gazell_params_cfg.h"
#include <stdint.h>
#include <stdbool.h>

// 配对通讯使用的通道，默认使用通道0，不要改动
#define GZP_PAIRING_PIPE                          0
// 主机地址长度，默认为5个字节，不要改动
#define GZP_SYSTEM_ADDRESS_WIDTH                  5    
// 设备地址请求命令长度，默认为1个字节，不要改动
#define GZP_CMD_HOST_ADDRESS_REQ_PAYLOAD_LENGTH   1
// 设备获取主机地址命令，默认为1个字节，不要改动
#define GZP_CMD_HOST_ADDRESS_FETCH_PAYLOAD_LENGTH 1
// 主机获取设备设备地址请求命令，默认为1个字节，不要改动
#define GZPAR_CMD_FETCH_RESP_PAYLOAD_LENGTH       1
// 主机响应设备地址请求命令长度，默认为1个字节，不要改变
#define GZP_CMD_HOST_ADDRESS_RESP_ADDRESS         1
#define GZP_CMD_HOST_ADDRESS_RESP_PAYLOAD_LENGTH (GZP_CMD_HOST_ADDRESS_RESP_ADDRESS + GZP_SYSTEM_ADDRESS_WIDTH) 
// 检测发送载荷是否满足配对传输
#if(GZLL_MAX_FW_PAYLOAD_LENGTH < GZP_CMD_HOST_ADDRESS_RESP_PAYLOAD_LENGTH)
    #error GZLL_MAX_FW_PAYLOAD_LENGTH must be greater or equal to GZP_CMD_HOST_ADDRESS_RESP_PAYLOAD_LENGTH.
#endif
// 检测发送载荷是否满足配对传输
#if(GZLL_MAX_ACK_PAYLOAD_LENGTH < GZP_CMD_HOST_ADDRESS_RESP_PAYLOAD_LENGTH)
    #error GZLL_MAX_ACK_PAYLOAD_LENGTH must be greater or equal to GZP_CMD_HOST_ADDRESS_RESP_PAYLOAD_LENGTH.
#endif

//-----------------------------------------------------------------------------
// Typedefs
//-----------------------------------------------------------------------------
typedef enum {
    GZP_CMD_HOST_ADDRESS_REQ = 0,        
    GZP_CMD_HOST_ADDRESS_FETCH,
    GZP_CMD_HOST_ID_REQ,
    GZP_CMD_HOST_ID_FETCH,
    GZP_CMD_KEY_UPDATE_PREPARE,
    GZP_CMD_KEY_UPDATE,      
    GZP_CMD_ENCRYPTED_USER_DATA,
    GZP_CMD_FETCH_RESP,
    GZP_CMD_HOST_ADDRESS_RESP,
    GZP_CMD_HOST_ID_FETCH_RESP,
    GZP_CMD_KEY_UPDATE_PREPARE_RESP,
    GZP_CMD_ENCRYPTED_USER_DATA_RESP,
} gzp_cmd_t;

// ==================================================================
/// @brief  : 更新nrf 跳频列表和通讯地址
/// @param  : system_address 系统通讯地址,地址长度为5个字节
// ==================================================================
void gzp_update_radio_params(const uint8_t *system_address);

// ==================================================================
/// @brief  : 生成跳频列表
/// @param  : ch_dst 频道缓存区
/// @param  : system_address 系统通讯地址,是根据地址来产生跳频频道
/// @param  : channel_tab_size 跳频频道大小
// ==================================================================
void gzp_generate_channels(uint8_t *ch_dst, const uint8_t *system_address, uint8_t channel_tab_size);

// ==================================================================
/// @brief  : 配对协议初始化，分为主机和设备,主机和设备初始化必须都要调用
// ==================================================================
void gzp_init(void);

// ==================================================================
/// @brief  : 设备请求系统通讯地址
/// @param  : gzp_system_address 设备获取到主机的地址，长度固定为5个字节
/// @returns: true 收到主机发的系统地址
/// @returns: false 没有收到主机发的系统地址
// ==================================================================
bool gzp_address_req_send(uint8_t *gzp_system_address);

// ==================================================================
/// @brief  : 主机配网使能控制
/// @param  : enable 是否使能
// ==================================================================
void gzp_pairing_enable(bool enable);

// ==================================================================
/// @brief  : 执行Gazell配对库主机操作
// ==================================================================
void gzp_host_execute(void);

// ==================================================================
/// @brief  : 获取数据交换状态
/// @returns: true or false 
// ==================================================================
bool gzp_address_exchanged(void);

#endif
